package com.znzz.controller;

import com.znzz.entity.SysLog;
import com.znzz.entity.User;
import com.znzz.service.SysLogService;
import org.aspectj.lang.JoinPoint;
import org.aspectj.lang.annotation.After;
import org.aspectj.lang.annotation.Aspect;
import org.aspectj.lang.annotation.Before;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;

import javax.servlet.http.HttpServletRequest;
import java.lang.reflect.Method;
import java.util.Date;

@Component
@Aspect
public class LogAopController {

    @Autowired
    private HttpServletRequest request;
    @Autowired
    private SysLogService sysLogService;

    private Date visitTime;//开始时间
    private Class aClass;//访问的类
    private Method method;//访问的方法



    //前置通知,主要获取开始时间，执行的类是哪一个，执行的是哪一个方法
    @Before("execution(* com.znzz.controller.*.*(..))")
    public void doBefore(JoinPoint jp) throws NoSuchMethodException {
        visitTime=new Date(); //当前时间就是开始访问的时间
        System.out.println("visitTime:"+visitTime);
        aClass=jp.getTarget().getClass();//具体访问的类
        String methodName=jp.getSignature().getName();//获取访问的方法的名称
        Object[] args=jp.getArgs();//获取访问的方法的参数

        //获取具体执行的方法的Method对象
        if(args==null || args.length==0){
            method=aClass.getMethod(methodName);//只能获取无参数的方法
        }else {
            Class[] classArgs=new Class[args.length];
            for (int i=0;i<=args.length;i++){
                classArgs[i]=args[i].getClass();
            }
            aClass.getMethod(methodName,classArgs);
        }

    }

    //后置通知
    @After("execution(* com.znzz.controller.*.*(..))")
    public void doAfter(JoinPoint jp) throws Exception {
        long time=new Date().getTime()-visitTime.getTime();//获取访问的时长

        String url="";
        //获取url
        if(aClass!=null && method!=null && aClass!= LogAopController.class){
            //1、获取类上的@RequestMapping("teacher")
           RequestMapping classAnnotation=(RequestMapping) aClass.getAnnotation(RequestMapping.class);
           if(classAnnotation !=null){
               String[] ClassValue=classAnnotation.value();

               //2、获取方法上的@RequestMapping(xxx)
               RequestMapping methodAnnotation=method.getAnnotation(RequestMapping.class);
               if(methodAnnotation!=null){
                   String[] MethodValue=methodAnnotation.value();
                   url=ClassValue[0]+MethodValue[0];

                   //获取访问的ip
                   String ip=request.getRemoteAddr();

                   //获取当前操作的用户
                   //获取当前用户信息
                   User userCur=(User)request.getSession().getAttribute("session_user");
                   String username=userCur.getUsername();
                   System.out.println("url:"+url);
                   //将日志相关信息封装到SysLog对象中
                   SysLog sysLog=new SysLog();
                   sysLog.setVisitTime(visitTime);
                   sysLog.setUsername(username);
                   sysLog.setIp(ip);
                   sysLog.setUrl(url);
                   sysLog.setExcutionTime(time);
                   sysLog.setMethod("[类名]:"+aClass.getName()+"[方法名]:"+method.getName());
                   //利用service完成操作
                   sysLogService.save(sysLog);

               }
           }
        }
    }

}
